// 访问权限拦截（在路由的导航守卫中判断 token）
// 导入路由对象
import router from '@/router'
// 导入操作 token 的方法
import { getToken } from '@/utils/auth'
// 导入提示框
import { Message } from 'element-ui'
// 导入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 导入 store
import store from '@/store'

// 定义一个白名单
const whiteList = ['/404', '/login']

// 添加前置守卫
// to: 路由要跳转的目标页面
// from：路由从哪个页面中跳转的
// next：是否向下执行
router.beforeEach(async (to, from, next) => {
  // 进入页面之前开启进度条
  NProgress.start()
  // 得到 token
  const token = getToken()
  if (token) {
    // 存在
    // 得到用户信息
    const userInfo = store.getters.userInfo
    // 判断用户信息是否存在
    if (!userInfo.username) {
      // 不存在：获取用户信息
      const userInfo = await store.dispatch('user/getUserInfo')
      // 路由的筛选
      const newRoutes = await store.dispatch(
        'permission/setRoutes',
        userInfo.roles.menus
      )
      // 将动态路由动态添加到 routes 中
      router.addRoutes([
        ...newRoutes,
        { path: '*', redirect: '/404', hidden: true }
      ]) // 在这个导航守卫执行完成之后才会存在动态路由
      // 为了保存跳转之后路由能够正常加载，我们直接在这里转一个圈
      next(to.path)
    }
    // 判断是否访问的登录页面
    if (to.path === '/login') {
      // 是
      Message.info('您已经登录过了，不要调皮')
      NProgress.done()
      next('/')
    } else {
      // 否
      next() // 刷新之后会继续访问： /approvals
    }
  } else {
    // 不存在
    // 判断访问的路由是否在白名单中
    const bool = whiteList.includes(to.path)
    if (bool) {
      next()
    } else {
      // 不在
      Message.info('对不起，您还没有登录')
      // 跳转到 login 之前，保存当前访问的路径 to.path
      next(`/login?_redirect=${to.path}`)
    }
  }
})

// 后置钩子
router.afterEach((to, from) => {
  NProgress.done()
})
